/**
 * Root Namespace
 */
var XM = {};

/**
 * 基础语言函数
 *
 * @singleton
 * @author Siemen Liu
 * @date 2011-02-02
 */
XM.lang = {
    /**
     * 创建命名空间
     *
     * 命名空间必须是不存在或已存在且类型为object
     * 命名空间不存在则创建
     * 如果存在且typeof为非object则报错
     *
     * @param ns {string}
     */
    namespace: function (ns) {
        var na = ns.split('.');
        var s = '';
        for (var i = 0; i < na.length; i++) {
            s += na[i]; 
            if (!eval(s)) {
                eval(s + ' = {}');
            } else if (eval('typeof ' + s) !== 'object') {
                throw new Error('Namespace: ' + s + ' already existed and not object!');
            }
            if (i + 1 < na.length) s += '.';
        }
    },

    /**
     * 建立继承关系
     *
     * 通过此方法建立继承关系的子类可以
     * 通过子类构造的superclass属性访问父类方法
     *
     * 快速例子：
     * function Parent () {};
     * function Child () {
     *     Parent.call(this);
     * };
     * XM.lang.inherits(Child, Parent);
     *
     * @param SubClass {Function}
     * @param SuperClass {Function}
     */
    inherits: function (SubClass, SuperClass) {
        SubClass.prototype = new SuperClass();
        SubClass.prototype.constructor = SubClass;
        SubClass.superclass = SuperClass.prototype;
    },

    /**
     * 克隆对象
     * @param obj {object}
     */
    clone: function (obj) {
        function F () {};
        F.prototype = obj;
        return new F();
    },

    /**
     * obj中是否包含key
     * obj是数组检查是否存在key的值
     * obj是对象检查是否存在key属性
     * @param key {string|object}
     * @param obj {Array|Object}
     * @return {boolean}
     */
    contain: function (key, obj) {
        if (obj instanceof Array) {
            for (var i = 0, len = obj.length; i < len; i++) {
                if (obj[i] === key) return true;
            }
        } else if (obj instanceof Object) {
            return key in obj;
        }

        return false;
    }
};